package com.bbx.demo.nio;

import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

@Slf4j
public class ByteBufferTest4 {

    public static void main(String[] args) throws IOException {
        log.info("开始读入");
        long start = System.currentTimeMillis();
        FileInputStream inputStream = new FileInputStream("./src/main/resources/fileInput.txt");
        FileChannel channel = inputStream.getChannel();
        //ByteBuffer.allocateDirect  创建直接buffer ---此Buffer 是直接存在系统内存中的，在java 堆内存中存放的是系统内存中的地址，在进行IO操作时就不会在进行拷贝，当java 堆内存中的引用释放时，会将系统内存中的buffer 释放---采用的是零拷贝技术，
        //ByteBuffer.allocate(512)   创建的内存是在java 堆内存中，进行IO操作时，需要先将Buffer 拷贝到系统内存中 ，然后进行IO操作，系统中内存中的buffer 使用完毕后，由系统进行释放，
        //demo中使用直接buffer  耗时为252
        //demo 中使用间接buffer 耗时为 456
        ByteBuffer buffer = ByteBuffer.allocateDirect(512000000);
//        ByteBuffer buffer = ByteBuffer.allocate(512000000);

        int read = channel.read(buffer);
        log.info("read[{}]", read);
        log.info("开始写出");
        buffer.flip();
        FileOutputStream outputStream = new FileOutputStream("./src/main/resources/fileOutput2.txt");
        outputStream.getChannel().write(buffer);
        inputStream.close();
        outputStream.close();
        channel.close();
        long end = System.currentTimeMillis();
        log.info("消耗时间[{}]", end - start);


    }


}
